#include <stdio.h>
#include <stdarg.h>
#include <string>
#include <iostream>


//C语言
//不定参宏函数的使用
#define LOG(fmt,...) printf("%s:%s:%d" fmt,__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);
//前面带两个##，当如果没有可变参数时，会主动把前面的“，”去掉
//__FILE__表示当前文件名
//__FUNCTION__表示当前函数名
//__LINE__表示当前行号

//第一个参数告诉我们有多少个数据
void IntPrint(int fmt,...){
    va_list ap;
    va_start(ap, fmt);
    for (int i = 0; i < fmt;++i){
        int num = va_arg(ap, int);
        std::cout << num << std::endl;
    }
    va_end(ap);
}
// va_arg中的参数不能是以下类型
//  ——char、signed char、unsigned char
//  ——short、unsigned short
//  ——signed short、short int、signed short int、unsigned short int
//  ——float
void FloatPrint(double fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    for (int i = 0; i < fmt; ++i)
    {
        double num = va_arg(ap, double);
        std::cout << num << std::endl;
    }
    va_end(ap);
}
void ymbxPrint(const char* fmt,...){
    va_list ap;
    va_start(ap,fmt);
    char buffer[1024];
    //返回打印的字节数
    int n = vsprintf(buffer, fmt, ap);
    if(n>=0) std::cout << "n:"<<n<<"---"<<buffer << std::endl;
    va_end(ap);
}


//-------------------------------------------------------------

//C++风格

//为使得递归结束，必须有一个终止的函数
void ymbxCppPrint(){
    std::cout << std::endl;
}
template<typename T,typename ...Args>
void ymbxCppPrint(const T& t,Args&& ...args){
    std::cout << t;
    if(sizeof...(args)>0){
        ymbxCppPrint(std::forward<Args>(args)...);
    }else{
        std::cout << std::endl;
        return;
    }
    // ymbxCppPrint(std::forward<Args>(args)...);
}

// template <typename... Args>
// void printArgs(Args... args)
// {
//     ((std::cout << args << " "), ...);
// }
int main(){
    // // LOG("ymbx");
    // // ymbxPrint("% s, % d",  "bite",1);
    // // std::cout << sizeof("bite") << std::endl;
    // // IntPrint(2, 3, 5);
    FloatPrint(2, 3.1, 3.2);
    // ymbxCppPrint("aaa");
    // // printArgs();

}